package Fanshe;

import org.junit.Test;

/**
 * 反射总结：
 * 1获取字节码的方式（三种）
 * 类名.class
 * getclass()方法
 *  class.forname(全限定类名)
 * 2获取构造器的api
 * constructor getconstructor(class...parmarytypes  )
 * 根据参数类型获取构造方法对象   只获取public修饰的构造器对象
 * constructor getDeclaredconstructor(class...parmarytypes)
 * 根据参数类型获取构造方法对象private修饰的都可获取到
 * constructor[] get constructor()(了解)
 *获取所有公共修饰的构造器调用方法之后就能拿到所有的构造器
 * 3 获取所有方法的api
 * //反射获取所有方法的api
 * 1，method getmethod("方法名"，方法的参数类型....类型)
 * 根据方法和参数类型获得一个方法对象只能获取public修饰
 * 2method getDeclaredmethod("私有方法名称"，方法的参数类型...类型)
 * 根据方法和参数类型获得一个方法对象获取private修饰的
 * 3 method invoke（object object，object...args）
 * 让方法执行的核心方法
 *4 getmethods 获取所有方法
 * 4 获取所有成员属性的api
 * Field getDeclaredField（属性名称）
 *根据属性名称获取属性对象获取private修饰的
 * Filed[] getFileds
 *获取全部的成员属性包括公共和私有
 * set()给属性赋值
 * 反射的优点：比传统的创建对象更加灵活
 */

public class Getclass {
    @Test
    public void test1(){
        //方式一通过类名.class来调用
        Class<Student> studentClass = Student.class;
    }
    @Test
    public void test2(){
        //方式二 通过object类的成员方法getclass来获取
        Class<? extends Student> aClass = new Student().getClass();

    }
    @Test
    public void test3() throws ClassNotFoundException {
        //方法三 通过class.forname（）方法来获取
        Class<?> aClass = Class.forName("Fanshe.Student");


    }
}
